 using namespace std;
 #include <iostream>
 #include "router.hpp"
 #include "maquina.hpp"

#ifndef _Lista_
#define _Lista_
 
 // Asi es como declaramos una clase plantilla
 // template <class nombre_generico> class NombreClase
 template <class GENERICO> class Lista
 {
          public:
            // Constructor
            Lista();
            // Constructor
            Lista(GENERICO elemento);
             // Constructor copia
            Lista(Lista const &);
             // Destructor
            ~Lista();
             // agregar elemento
            void agregar(Lista *nodo);
             // se mueve hasta el siguiente dato
            Lista* siguiente();
             // comprueba si existe un elemento
            bool existe(GENERICO dato);
             
            GENERICO getDato() { return this->dato;}
            
            GENERICO* getD() { return &this->dato;}
 
          private:
             // un elemento que apunta a otra lista, asi sucesivamente
            Lista *ladealado;
             // el dato es del tipo GENERICO
            GENERICO dato;
  };
  
  
  
  // En la implementacion debemos detallar el tipo de dato,
 // especificando todo el tema de plantilla, o sea que en lugar
 // de poner Lista:: delante de cada funcion debemos poner TODO
 // el churro siguiente
 // template <class GENERICO> Lista<GENERICO>::nombreFuncion
 
  // Constructor
 template <class GENERICO> Lista<GENERICO>::Lista()
 {
      ladealado = 0;
 }
  
 // Constructor
 template <class GENERICO>  Lista<GENERICO>::Lista(GENERICO elemento) 
 {
      ladealado = 0;
      dato = elemento;
 }
 
  // Constructor copia
 template <class GENERICO> Lista<GENERICO>::Lista(Lista  const & original) 
 {
      ladealado = new Lista;
      ladealado = original.ladealao;
      dato = original.dato;
 }
 
  // Destructor
 template <class GENERICO> Lista<GENERICO>::~Lista() 
 {
 }
 
 // agregar elemento: AL LORO con donde se pone el retonno
 template <class GENERICO> void  Lista<GENERICO>::agregar(Lista *nodo)
 {
    nodo->ladealado = this;
    ladealado = 0; 
 }
 
 // se mueve hasta el siguiente dato
 template <class GENERICO> Lista<GENERICO>*  Lista<GENERICO>::siguiente() 
 {
       return ladealado;
 }
 
 //Lista template <class GENERICO> Lista<GENERICO>::siguiente();
 // comprueba si existe un elemento
 template <class GENERICO> bool  Lista<GENERICO>::existe(GENERICO dato)
 {
      return false;
 }

  
  
  
  
  
  
#endif


//template class Lista<Router>;

 
